import axios, {
    AxiosInstance,
    AxiosResponse,
    InternalAxiosRequestConfig
} from 'axios';
import { ElMessage } from 'element-plus';

const baseURL = import.meta.env.VITE_API_BASE_URL || '/api';

const request: AxiosInstance = axios.create({
    baseURL,
    timeout: 10000,
    headers: { 'Content-Type': 'application/json' }
});

// 请求拦截器
request.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        const token = localStorage.getItem('token');
        if (token) {
            config.headers.set('Authorization', `Bearer ${token}`);
        }
        return config;
    },
    (error) => Promise.reject(error)
);

// 响应拦截器：统一错误提示
request.interceptors.response.use(
    (response: AxiosResponse) => {
        // 如果后端约定 code !== 0 为错误，可在这里统一处理
        // if (response.data.code !== 0) {
        //   ElMessage.error(response.data.message || '请求异常');
        //   return Promise.reject(response.data);
        // }
        return response;
    },
    async (error) => {
        const { response, config } = error;

        // 检查是否有响应且状态码为500
        if (response && response.status === 500) {
            // 获取重试次数，默认为0
            const retryCount = config.retryCount || 0;
            // 设置最大重试次数
            const maxRetries = 3;

            if (retryCount < maxRetries) {
                // 增加重试次数
                config.retryCount = retryCount + 1;

                // 设置重试延迟时间（毫秒），可以逐步增加延迟
                const delay = Math.pow(2, retryCount) * 1000; // 指数退避算法

                // 等待指定时间后重试
                await new Promise(resolve => setTimeout(resolve, delay));

                // 重新发送请求
                return request(config);
            } else {
                // 达到最大重试次数，显示错误信息
                console.error(`[HTTP 500] 服务器内部错误，已重试${maxRetries}次仍失败`, response);
                ElMessage.error('服务器内部错误，请稍后重试');
            }
        } else if (response) {
            const status = response.status;
            const errorMessageMap: Record<number, string> = {
                400: '请求参数错误',
                401: '未授权，请重新登录',
                403: '拒绝访问',
                404: '资源未找到',
                500: '服务器内部错误',
                503: '服务不可用'
            };

            const message = errorMessageMap[status] || '系统异常';

            // 对 404 只打印日志，不提示用户
            if (status === 404) {
                console.error(`[HTTP ${status}]`, response);
            } else {
                ElMessage.error(message);
            }
        } else {
            console.error('网络异常，请检查网络', error);
            ElMessage.error('网络异常，请检查网络');
        }

        return Promise.reject(error);
    }
);

export default request;
